package com.stu.utils;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

/**
 * 文件重命名帮助类
 * @author Administrator
 *
 */
public class FileRenamePolicy implements com.oreilly.servlet.multipart.FileRenamePolicy{

	/**
	 * 对文件进行重命名，通过数字叠加				
	 *	先创建指定的文件如果创建失败，认为已经存在该文件，对文件进行重命名，再创建文件，注意没有内容，
	 * 如：d:/1.txt --> d:/11.txt --> d:/12.txt --> ...
	 * -->d:/19.txt --> d:/110.txt --> d:/111.txt --> d:/112.txt 
	 * @param f 要重命名的文件，注意这里是完整路径
	 * @return 重命名之后的文件（注意这个文件已经创建了，但是没有内容）
	 */
	public static File renameByNumber(File f) {
		if (createNewFile(f)) {
			return f;
		}
		String name = f.getName();
		String body = null;
		String ext = null;

		int dot = name.lastIndexOf(".");
		if (dot != -1) {
			body = name.substring(0, dot);
			ext = name.substring(dot); // includes "."
		} else {
			body = name;
			ext = "";
		}
		int count = 0;
		while (!createNewFile(f) && count < 9999) {
			count++;
			String newName = body + count + ext;
			f = new File(f.getParent(), newName);
		}

		return f;
	}

	private static boolean createNewFile(File f) {
		try {
			return f.createNewFile();
		} catch (IOException ignored) {
			return false;
		}
	}
	
	/**
	 * 重命名文件，通过时间戳
	 * 	直接重命名，没有尝试创建
	 * @param file 要重命名的文件，注意这里是完整路径
	 * @return 重命名之后的文件（注意这里是直接重命名的，没有尝试创建）
	 */
	public static File renameByTimeStamp(File file) {  
        String body = "";  
        String ext = "";  
        Date date = new Date();  
        int pot = file.getName().lastIndexOf(".");//取得文件名和后缀分割点  
        if (pot != -1) {//说明后缀存在  
            body = date.getTime() + "";//采用时间的形式命名  
            ext = file.getName().substring(pot);//截取后缀名  
        } else {  
            body = (new Date()).getTime() + "";  
            ext = "";  
        }  
        String newName = body + ext;  
        file = new File(file.getParent(), newName);//对文件进行重命名  
        return file;  
    } 
	
	/**
	 * 重命名文件，注意参数是文件名不是文件整个路径，通过时间戳
	 * 	直接重命名，没有尝试创建
	 * @param fileName 要重命名的文件名字符串，注意这里只是文件名，不是完整路径
	 * @return 重命名之后的字符串
	 */
	public static String renameByTimeStamp(String fileName) {  
        String body = "";  
        String ext = "";  
        Date date = new Date();  
        int pot = fileName.lastIndexOf(".");//取得文件名和后缀分割点  
        if (pot != -1) {//说明后缀存在  
            body = date.getTime() + "";//采用时间的形式命名  
            ext = fileName.substring(pot);//截取后缀名  
        } else {  
            body = (new Date()).getTime() + "";  
            ext = "";  
        }  
        return body + ext;  
    }
	
	/**
	 * 重命名文件名，注意参数是文件名不是文件整个路径，通过时间戳
	 * 	直接重命名，没有尝试创建
	 * @param fileName 要重命名的文件名字符串，注意这里只是文件名，不是完整路径
	 * @return 重命名之后的字符串
	 */
	public static String renameByUUID(String fileName) {  
        String body = "";  
        String ext = "";  
        int pot = fileName.lastIndexOf(".");//取得文件名和后缀分割点  
        if (pot != -1) {//说明后缀存在  
            body =  UUID.randomUUID().toString();//采用时间的形式命名  
            ext = fileName.substring(pot);//截取后缀名  
        } else {  
            body = UUID.randomUUID().toString();  
            ext = "";  
        }  
        return body + ext;  
    }

	@Override
	public File rename(File f) {
		return FileRenamePolicy.renameByNumber(f);
	}

//	public static void main(String[] args) {
//		System.out.println(renameByUUID("1.txt"));
//	}

}
